package com.neusoft.elmboot.config;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;

@Component
public class TestEnvInterceptor implements HandlerInterceptor {

    // 定义一个环境变量，这里硬编码为测试环境。最佳实践是从配置文件读取。
    private static final String CURRENT_ENV = "test";

    // 定义一个需要被拦截的API路径前缀列表
    private static final List<String> API_PATH_PREFIXES = Arrays.asList(
        "/api/", 
        "/v1/", 
        "/v2/",
        "/admin/",
        "/user/"
        // ...添加你的其他API接口路径共有的前缀
    );

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        // 1. 如果不是测试环境，放行所有请求
        if (!"test".equals(CURRENT_ENV)) {
            return true;
        }

        String method = request.getMethod();
        String requestURI = request.getRequestURI(); // 获取请求的路径

        // 2. 放行所有GET请求（包括页面和静态资源）
        if ("GET".equalsIgnoreCase(method)) {
            return true;
        }

        // 3. 【关键修复】检查请求路径是否是API路径
        boolean isApiRequest = false;
        for (String prefix : API_PATH_PREFIXES) {
            if (requestURI.startsWith(prefix)) {
                isApiRequest = true;
                break;
            }
        }

        // 4. 如果不是API请求（比如是页面表单提交），也放行
        if (!isApiRequest) {
            return true;
        }

        // 5. 只有当【非GET请求】且是【明确的API请求】时，才进行拦截和Mock
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        response.setStatus(HttpServletResponse.SC_OK);

        String mockJsonResponse = """
            {
                "code": 200,
                "message": "[测试环境] API写操作已被拦截，真实数据不会被影响。请求路径: %s",
                "data": {
                    "id": 9999,
                    "mock": true
                }
            }
            """.formatted(requestURI); // 格式化字符串，输出被拦截的路径
        response.getWriter().write(mockJsonResponse);
        return false;
    }
}